﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using SeguroSoft.Models;
using SeguroSoft.Model.Model;


namespace SeguroSoft.Controllers
{
    public class ServicioTecnicoController : Controller
    {

        private RepositorioServicioTecnico repositorioServicio = new RepositorioServicioTecnico();
        static private ContenedorServicioTecnico contenedor;
        private string marcaSeleccionada;
        static private int idServicioElegido;
        static private List<ServicioTecnico> servicioselegidos = new List<ServicioTecnico>();
        private CompararController comparar;

        public ActionResult Index()
        {
            contenedor = new ContenedorServicioTecnico();
            contenedor.MarcasModelos = this.MarcaModelos();
            marcaSeleccionada = "";
            return IndexConMarcas();
        }

        public ActionResult IndexConMarcas()
        {
            string marca = null;
            if (Request != null)
            {
                marca = Request.Form["marca"];
            }
            if (marca != null)
            {
                foreach (string mar in contenedor.MarcasModelos.Keys)
                {
                    if (marca.Equals(mar))
                    {
                        contenedor.MarcaSeleccionada = mar;
                    }
                }
            }
            else
            {
                contenedor.MarcaSeleccionada = marcaSeleccionada;
            }
            return View("IndexST", contenedor);
        }

        public ActionResult Seleccionar(int id)
        {
            return MostrarServicio(id);
        }

        public ActionResult MostrarServicio(int id)
        {
            ServicioTecnico serv = repositorioServicio.ObtenerServicioTecnico(id);
            idServicioElegido = id;
            return View("SeleccionarST", serv);
        }

        public ActionResult GuardarComentario()
        {
            string titulo = Request.Form["titulo"];
            string contenido = Request.Form["contenido"];
            string usuario = this.User.Identity.Name;
            if (usuario.Equals(""))
            {
                List<string> aux = new List<string>();
                aux.Add("Tiene que loguearse para comentar");
                aux.Add("VolverAlServicio");
                return View("Not FoundST", aux);
            }
            int ranking;
            Int32.TryParse(Request.Form["ranking"], out ranking);
            Comentario comentario = new Comentario();
            comentario.Fecha = DateTime.Now;
            comentario.Titulo = Request.Form["titulo"];
            comentario.Contenido = Request.Form["contenido"];
            comentario.RankingServicio = ranking;
            comentario.Usuario = usuario;
            RepositorioComentario repositorioComentarios = new RepositorioComentario();
            repositorioComentarios.crearcomentario(comentario);
            
            TIST tist = new TIST();
            tist.IDComentario = repositorioComentarios.ObtenerId(titulo, contenido, usuario);
            tist.IDServicioTecnico = idServicioElegido;
            repositorioServicio.crearTist(tist);
            return VolverAlServicio();

        }

        public ActionResult VolverAlServicio()
        {
            ServicioTecnico serv = repositorioServicio.ObtenerServicioTecnico(idServicioElegido);
            return View("SeleccionarST", serv);
        }


        public ActionResult Comparar()
        {
            string lista = Request.Form["comparar"];
            List<string> idservicios = new List<string>();
            List<ServicioTecnico> servicios = new List<ServicioTecnico>();
            comparar = new CompararController();
            if (lista != null)
            {
                idservicios = lista.Split(',').ToList();
                foreach (string servicio in idservicios)
                {
                    int aux = 0;
                    Int32.TryParse(servicio, out aux);
                    servicios.Add(repositorioServicio.ObtenerServicioTecnico(aux));
                }
            }
            if (idservicios.Count > 1)
            {
                return comparar.CompararViewServicioTecnico(servicios);
            }
            else
            {
                List<string> aux = new List<string>();
                aux.Add("Tiene que seleccionar más de dos elementos");
                aux.Add("MostrarServicioTecnicosPorDefault");
                return View("Not FoundST", aux);
            }
        }

        public ActionResult Comentar()
        {
            return View("ComentarST", idServicioElegido);
        }

        public ActionResult MostrarServicioTecnicosPorDefault()
        {
            List<List<ServicioTecnico>> listaServicio = new List<List<ServicioTecnico>>();
            listaServicio.Add(servicioselegidos);
            return View("MostrarST", listaServicio);
        }

        public ActionResult BusquedaGeneral(string algo)
        {
            servicioselegidos = new List<ServicioTecnico>();
            servicioselegidos.AddRange(repositorioServicio.EncontrarServicioTecnicoPorMarca(algo).ToList());
            servicioselegidos.AddRange(repositorioServicio.EncontrarServicioTecnicoPorModelo(algo).ToList());
            if (algo.Equals(""))
            {
                servicioselegidos = repositorioServicio.EncontrarTodosServiciosTecnicos().ToList();
            }
            List<List<ServicioTecnico>> listaServicio = new List<List<ServicioTecnico>>();
            listaServicio.Add(servicioselegidos);
            return View("MostrarST", listaServicio);
        }

        public ActionResult MostrasServiciosTecnicos()
        {
            List<string> marmod = Request.Form["modelo"].Split(' ').ToList();
            var marca = marmod[0];
            var modelo = marmod[1];
            var año = Request.Form["ano"];
            var km = Request.Form["kilometraje"];
            var tipoBencina = Request.Form["tipoBencina"];
            servicioselegidos = repositorioServicio.EncontrarServicioTecnicoPor(marca, modelo, año, km, tipoBencina).ToList();
            if (marca.Equals("NA") && modelo.Equals("NA") && año.Equals("NA") && tipoBencina.Equals("NA"))
            {
                servicioselegidos = repositorioServicio.EncontrarTodosServiciosTecnicos().ToList();
            }
            List<List<ServicioTecnico>> listaServicio = new List<List<ServicioTecnico>>();
            listaServicio.Add(servicioselegidos);
            return View("MostrarST", listaServicio);
        }

        public ActionResult VolverALaListaDeServicios()
        {
            List<List<ServicioTecnico>> listaServicio = new List<List<ServicioTecnico>>();
            listaServicio.Add(servicioselegidos);
            return View("MostrarST", listaServicio);
        }

        

        public ActionResult Filtrar()
        {
            List<ServicioTecnico> wena = new List<ServicioTecnico>();
            string marca = Request.Form["marca"];
            string modelo = Request.Form["modelo"];
            string km = Request.Form["km"];
            string costo = Request.Form["costo"];

            if (marca.Equals("NA")) { }
            else
            {
                if (wena.Count == 0)
                {
                    foreach (ServicioTecnico servicio in servicioselegidos)
                    {
                        if (servicio.Marca.Equals(marca))
                        {
                            wena.Add(servicio);
                        }
                    }
                }
                else
                {
                    List<ServicioTecnico> nas = new List<ServicioTecnico>();
                    foreach (ServicioTecnico servicio in wena)
                    {
                        if (servicio.Marca.Equals(marca))
                        {
                            wena.Add(servicio);
                        }
                    }
                    wena = nas;
                }
            }
            if (modelo.Equals("NA")) { }
            else
            {
                if (wena.Count == 0)
                {
                    foreach (ServicioTecnico servicio in servicioselegidos)
                    {
                        if (servicio.Modelo.Equals(modelo))
                        {
                            wena.Add(servicio);
                        }
                    }
                }
                else
                {
                    List<ServicioTecnico> nas = new List<ServicioTecnico>();
                    foreach (ServicioTecnico servicio in wena)
                    {
                        if (servicio.Modelo.Equals(modelo))
                        {
                            nas.Add(servicio);
                        }
                    }
                    wena = nas;

                }
            }

            if (km.Equals("NA")) { }
            else
            {
                if (wena.Count == 0)
                {
                    foreach (ServicioTecnico servicio in servicioselegidos)
                    {
                        if (servicio.Km.Equals(km))
                        {
                            wena.Add(servicio);
                        }
                    }
                }
                else
                {
                    List<ServicioTecnico> nas = new List<ServicioTecnico>();
                    foreach (ServicioTecnico servicio in wena)
                    {
                        if (servicio.Km.Equals(km))
                        {
                            nas.Add(servicio);
                        }
                    }
                    wena = nas;

                }
            }
            if (costo.Equals("NA")) { }
            else
            {
                if (wena.Count == 0)
                {
                    foreach (ServicioTecnico servicio in servicioselegidos)
                    {
                        if (servicio.Costo.Equals(costo))
                        {
                            wena.Add(servicio);
                        }
                    }
                }
                else
                {
                    List<ServicioTecnico> nas = new List<ServicioTecnico>();
                    foreach (ServicioTecnico servicio in wena)
                    {
                        if (servicio.Costo.Equals(costo))
                        {
                            nas.Add(servicio);
                        }
                    }
                    wena = nas;

                }

            }
            if (wena.Count > 0)
            {
                List<List<ServicioTecnico>> listaServicio = new List<List<ServicioTecnico>>();
                listaServicio.Add(servicioselegidos);
                listaServicio.Add(wena);
                return View("MostrarST", listaServicio);

            }
            else
            {
                List<List<ServicioTecnico>> listaServicio = new List<List<ServicioTecnico>>();
                listaServicio.Add(servicioselegidos);
                return View("MostrarST", listaServicio);
            }
        }

        public Dictionary<string, List<string>> MarcaModelos()
        {
            Dictionary<string, List<string>> marcas = new Dictionary<string, List<string>>();

            string marca = "";
            string modelo = "";

            foreach (ServicioTecnico ser in repositorioServicio.EncontrarTodosServiciosTecnicos())
            {
                marca = ser.Marca;
                modelo = ser.Modelo;

                if (marcas.ContainsKey(marca))
                {
                    if (marcas[marca].Contains(modelo)) { }
                    else
                    {
                        marcas[marca].Add(modelo);
                    }
                }
                else
                {
                    marcas.Add(marca, new List<string>());
                    marcas[marca].Add(modelo);
                }
            }
            return marcas;
        }
    }
}
